import ApiClient from '@/api/apiClient';

import type { RequestBody } from 'alova';

/**
 * 设备项类型定义
 */
export interface DeviceItem {
  /**
   * 设备编码
   */
  code?: string;
  /**
   * 创建时间
   */
  createTime?: string;
  /**
   * 设备名称
   */
  deviceName?: string;
  /**
   * 设备id
   */
  id?: number;
  /**
   * 设备上传的imei号
   */
  imei?: string;
  /**
   * 最近在线时间
   */
  latestOnlineTime?: string;
  /**
   * 节点类型 1:直连设备 2:网关设备 3:网关子设备
   */
  nodeType?: number;
  /**
   * 设备激活数
   */
  offlineCount?: number;
  /**
   * 设备在线数
   */
  onlineCount?: number;
  /**
   * 所属产品code
   */
  productCode?: string;
  /**
   * 所属产品名称
   */
  productName?: string;
  /**
   * 描述
   */
  remark?: string;
  /**
   * 0自主创建 1自动创建
   */
  source?: number;
  /**
   * 0未激活 1在线 2离线3未知
   */
  status?: number;
  /**
   * 设备总数
   */
  sumCount?: number;
  [property: string]: unknown;
}

/**
 *
 * 设备详情
 */
export interface DeviceItemDetail {
  /**
   * 激活时间
   */
  activationTime?: string;
  /**
   * 位置信息
   */
  address?: string;
  /**
   * 设备编码
   */
  code?: string;
  /**
   * 设备创建时间
   */
  createTime?: string;
  /**
   * 数采推送接口
   */
  dataPushUrl?: string;
  /**
   * 设备名称
   */
  deviceName?: string;
  /**
   * 设备上传的imei号
   */
  imei?: string;
  /**
   * ip地址
   */
  ipAddress?: string;
  /**
   * 设备key
   */
  keyInfo?: string;
  /**
   * 最近在线时间
   */
  latestOnlineTime?: string;
  /**
   * 纬度
   */
  latitude?: number;
  /**
   * 绑定的位置ID
   */
  locationId?: number;
  /**
   * 经度
   */
  longitude?: number;
  /**
   * 所属产品物模型
   */
  metaData?: string;
  /**
   * 节点类型 1:直连设备 2:网关设备 3:网关子设备
   */
  nodeType?: number;
  /**
   * 所属产品编码
   */
  productCode?: string;
  /**
   * 所属产品id
   */
  productId?: string;
  /**
   * 所属产品名称
   */
  productName?: string;
  /**
   * 描述
   */
  remark?: string;
  /**
   * 0自主创建 1自动创建
   */
  source?: number;
  /**
   * 0未激活 1在线 2离线3未知
   */
  status?: number;
  /**
   * 产品缩略图
   */
  thumbnail?: string;
  [property: string]: any;
}

/**
 * SysServicesRecord对象，服务下发记录表
 */
export interface SysServicesRecord {
  /**
   * 创建人
   */
  createBy?: string;
  /**
   * 创建人id
   */
  createId?: number;
  /**
   * 创建时间
   */
  createTime?: string;
  /**
   * 设备编码
   */
  deviceCode?: string;
  /**
   * 执行时间
   */
  executionTime?: string;
  /**
   * 主键
   */
  id?: number;
  /**
   * 标识符
   */
  identifier?: string;
  /**
   * 输入参数
   */
  inputParam?: string;
  /**
   * 是否逻辑删除，0否,其他是
   */
  isDelete?: number;
  /**
   * 消息id 下发指令时候自动生成 用于更新执行状态
   */
  msgId?: string;
  /**
   * 输出参数
   */
  outputParam?: string;
  /**
   * 产品编码
   */
  productCode?: string;
  /**
   * 服务名称
   */
  serviceName?: string;
  /**
   * 来源类型 0:页面调用 1:规则触发
   */
  sourceType?: number;
  /**
   * 执行状态 0:待下发 1:已下发 2:已执行
   */
  status?: number;
  /**
   * 租户编码
   */
  tenantCode?: string;
  /**
   * 修改人
   */
  updateBy?: string;
  /**
   * 修改人id
   */
  updateId?: number;
  /**
   * 更新时间
   */
  updateTime?: string;
  /**
   * 乐观锁版本号
   */
  version?: number;
  [property: string]: any;
}

/**
 *
 * 事件记录返回实体
 */
export interface SysEventRecord {
  id?: number;
  /**
   * 标识符
   */
  identifier?: string;
  /**
   * 名称
   */
  name?: string;
  /**
   * 输出参数
   */
  outputParam?: string;
  /**
   * 上报时间
   */
  time?: number;
  [property: string]: any;
}

/**
 *
 * 设备历史数据
 */
export interface SysHistoryData {
  /**
   * 值
   */
  value?: string;
  /**
   * 输出参数
   */
  time?: string;
  [property: string]: any;
}

/** 设备历史上报数据 */
// 定义通用的 DataType 类型
type SysUploadDataType = {
  specs: {
    unit: string;
    min: string;
    max: string;
    step: string;
  };
  type: string;
};

// 定义 OutputData 和 InputData 通用类型
type SysUploadDataItem = {
  identifier: string;
  dataType: SysUploadDataType;
  name: string;
};

// 定义 Services 类型
type SysUploadService = {
  outputData: SysUploadDataItem[];
  identifier: string;
  inputData: SysUploadDataItem[];
  name: string;
  functionType: string;
  type: 'services';
  callType: 'sync';
  desc: string;
};

// 定义 Events 类型
type SysUploadEvent = {
  outputData: SysUploadDataItem[];
  identifier: string;
  name: string;
  functionType: string;
  type: 'events';
  desc: string;
};

// 定义 Properties 类型
type SysUploadProperty = {
  identifier: string;
  dataType: SysUploadDataType;
  name: string;
  functionType: string;
  type: 'properties';
  accessMode: 'r' | 'rw'; // 这里根据实际可能的取值限制，也可以用 string
  desc: string;
};

// 定义最外层的类型
export type SysUploadDataOldType = {
  services: SysUploadService[];
  events: SysUploadEvent[];
  properties: SysUploadProperty[];
};

/** 获取设备列表 */
export const deviceManagerListApi = (data: RequestBody) => {
  return ApiClient.Post<API.ListType<DeviceItem>>('/manager/device/page', data, {
    meta: { auth: true },
  });
};

/** 获取网关绑定的设备 */
export const deviceManagerChildDeviceByGateway = (gatewayPk: string, gatewayCode: string) => {
  return ApiClient.Get(`/manager/device/childDeviceByGateway/${gatewayPk}/${gatewayCode}`, {
    meta: { auth: true },
  });
};

/** 网关解绑设备 */
export const deviceManagerUnBindingGateWayDevice = (deviceId: string) => {
  return ApiClient.Get(`/manager/device/unBindingGateWayDevice/${deviceId}`, {
    meta: { auth: true },
  });
};

/** 保存或更新设备 */
export const deviceManagerSaveOrUpdateApi = (data: RequestBody) => {
  return ApiClient.Post<DeviceItem>('/manager/device/saveOrUpdate', data, {
    meta: { auth: true },
  });
};

/** 删除设备 */
export const deviceManagerRemoveApi = (data: Merged<RequestBody, { id: number }>) => {
  return ApiClient.Post<DeviceItem>(`/manager/device/remove/${data.id}`, data, {
    meta: { auth: true },
  });
};

/** 批量删除 */
export const deviceManagerBatchRemoveApi = (data: Merged<RequestBody, { ids: number[] }>) => {
  return ApiClient.Post<DeviceItem>(`/manager/device/batchRemoveById`, data, {
    meta: { auth: true },
  });
};

/** 设备详情 */
export const deviceManagerDetailApi = (data: Merged<RequestBody, { id: number }>) => {
  return ApiClient.Get<DeviceItemDetail>(`/manager/device/get/${data.id}`, {
    meta: { auth: true },
  });
};

/** 绑定网关 */
export const deviceManagerBindGatewayApi = (data: RequestBody) => {
  return ApiClient.Post('/manager/device/bindingGateWayDevice', data, {
    meta: { auth: true },
  });
};

/** 批量导入设备 上传前校验 */
export const deviceManagerImportCheckApi = (data: RequestBody) => {
  return ApiClient.Post('/manager/device/check', data, {
    meta: { auth: true },
  });
};
/** 批量导入设备 by产品编码 */
export const deviceManagerImportByProductCodeApi = (data: RequestBody, productCode: string) => {
  return ApiClient.Post(`/manager/device/import/${productCode}`, data, {
    meta: { auth: true },
  });
};
/** 服务下发记录 */
export const deviceManagerServiceRecordApi = (data: RequestBody) => {
  return ApiClient.Post<API.ListType<SysServicesRecord>>('/manager/services/record/page', data, {
    meta: { auth: true },
  });
};

/** 设备事件记录 */
export const deviceManagerEventRecordApi = (data: RequestBody) => {
  return ApiClient.Post<API.ListType<SysEventRecord>>('/manager/device/getEvents', data, {
    meta: { auth: true },
  });
};

/** 查看设备历史数据 */
export const deviceManagerHistoryApi = (data: RequestBody) => {
  return ApiClient.Post<API.ListType<SysHistoryData>>('/manager/device/historyDataQuery', data, {
    meta: { auth: true },
  });
};

/** 获取设备上报信息  */
export const deviceManagerReportApi = (
  data: Merge<RequestBody, { productCode: string; deviceCode: string }>
) => {
  return ApiClient.Get<SysUploadDataOldType>(
    `/manager/device/getProperties/${data.productCode}/${data.deviceCode}`,
    {
      meta: { auth: true },
    }
  );
};

/** 设备数采推送 */
export const deviceManagerDataPushApi = (
  data: Merged<RequestBody, { deviceCode: string; productCode: string; paramKey: string }>
) => {
  return ApiClient.Get('/manager/device/dataPush', {
    params: data,
    meta: { auth: true },
  });
};

/** 设备数据下发 */
export const deviceManagerDataSendApi = (data: RequestBody) => {
  return ApiClient.Post('/manager/services/record/cmdDown', data, {
    meta: { auth: true },
  });
};

/** 导出设备位置 */
export const deviceLocationExport = () => {
  return ApiClient.DownloadArrayBuffer(`/manager/bizLocationInfo/exportLocation`, {
    meta: { auth: true },
  });
};

/** 导出设备 */
export const deviceExport = data => {
  return ApiClient.DownloadBlobPost(`/manager/device/exportDevice`, data, {
    meta: { auth: true },
  });
};
